package com.strive.controller;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.strive.common.result.Result;
import com.strive.entity.SysMenu;
import com.strive.entity.SysRole;
import com.strive.mapper.SysUserMapper;
import com.strive.service.SysMenuService;
import com.strive.service.SysRoleService;
import com.strive.service.SysUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;
import java.util.stream.Collectors;

/**
 * @Author: strivePeng
 * @CreateTime: 2024年03月14日
 * @Description: 对该类的描述（该类的功能）
 **/
@RestController
public class TestController {
    // 测试
    @Autowired
    SysUserService sysUserService;

    // 测试密码如何生成
    @Autowired
    BCryptPasswordEncoder bCryptPasswordEncoder;

    @Autowired
    SysRoleService sysRoleService;

    @Autowired
    SysUserMapper sysUserMapper;

    @Autowired
    SysMenuService sysMenuService;

    @GetMapping("/test")
    // 返回的时候 直接返回封装好的result
    public Result test() {
        // 静态方法 直接可以使用类名调用
        return Result.success(sysUserService.list()); // 返回全部的列表信息
    }

    @GetMapping("/test/password")
    // 返回的时候 直接返回封装好的result
    public Result testPassword() {
        // 生成加密后的密码
        String password = bCryptPasswordEncoder.encode("111111");

        // 如何匹配解密后的密码？
        boolean matches = bCryptPasswordEncoder.matches("111111", password);
        System.out.println("匹配结果：" + matches);
        return Result.success(password); // 返回全部的列表信息
    }

    // 测试sql 查询用户角色
    @GetMapping("/test/roleCodes")
    public Result testRoleCodes() {
        List<SysRole> roles = sysRoleService.list(new QueryWrapper<SysRole>().
                // sql语句  select * from sys_role where id in (select role_id from sys_user_role where user_id = $user_id )
                        inSql("id", "select role_id from sys_user_role where user_id = 1"));

        if (roles.size() > 0) {
            // 转化为流的方式 同过get方法获取code属性，然后以，隔开, 同时添加上前缀 返回的结果格式如下： ROLE_admin
            String roleCodes = roles.stream().map(r -> "ROLE_" + r.getCode()).collect(Collectors.joining(","));
            System.out.println(roleCodes);
        }

        return Result.success(roles);
    }

    // 测试获取用户彩带你列表
    @GetMapping("/test/menuPerms")
    public Result testMenuPerms() {
        List<Long> menuIds = sysUserMapper.getNavMenuIds(3L);
        if (menuIds.size() > 0) {
            // 根据menuID获取所有的menu
            List<SysMenu> menus = sysMenuService.listByIds(menuIds);
            // 以流的方式推送
            String menuPerms = menus.stream().map(r -> r.getPerms()).collect(Collectors.joining(","));
            System.out.println(menuPerms);
        }
        return Result.success(menuIds);
    }

    /**
     * 测试用户权限的拦截
     * 权限的拦截使用到注解
     * @PreAnthorize（"hasAuthority('menu.perm权限')"） // 用户是否拥有某个菜单、按钮的权限
     * @PreAuthorize("hasRole('admin'用户role权限)") // 用户角色拦截
     */
    @PreAuthorize("hasAuthority('sys:user:list')")
    @GetMapping("/test/menu")
    public Result testPermMenu(){
        return Result.success("用户有该菜单或按钮的访问权限");
    }

    @PreAuthorize("hasRole('admin')")
    @GetMapping("/test/role")
    public Result testPermRole(){
        return Result.success("用户角色有访问权限");
    }
}
